import Vuex from 'vuex'
import defaultStore from './store/store'
import mutations from './mutations/mutations'
import getters from './getters/getters'
import actions from './actions/actions'
import iws from './modules/iws.js'

const isDev = process.env.NODE_ENV === 'development' // 开发环境

export default () => {
  const store = new Vuex.Store({ // 使用热更替用这行，否则用下面一行
  // return new Vuex.Store({
    // strict: true,  // 这个意思是state里面的数据就只能在mutations里面修改，不能在外面（单路由界面）改，注意这个不要在正式环境加，开发环境加为了规范代码
    strict: isDev, // 同上
    state: defaultStore,
    mutations,
    getters,
    actions,
    // 模块：modules，里面可以声明各种不同的state、mutations、getters、actions
    modules: {
      iws,
      a: {
        namespaced: true, // 当模块里面的mutations的名字和上面的mutations相同时就会冲突，这样的话就可以在不同模块的mutations里面定义相同的名字
        state: {
          text: 1,
          text1: 1,
          text2: 3,
          text3: 4
        },
        mutations: {
          // 这里的state不是上面的state，而是模块a里面的state
          updateText (state, text) {
            state.text1 = text
          },
          updateText1 (state, text) {
            state.text2 = text
          },
          updateText2 (state, text) {
            state.text3 = text
          }
        },
        getters: {
          // 3个参数，getters：所有的getters方法，rootState：全局的state
          textPlus (state, getters, rootState) {
            return state.text + rootState.count5
          },
          // 也可以引入模块内的
          textPlus1 (state, getters, rootState) {
            return state.text + rootState.b.text
          }
        },
        actions: {
          add ({ state, commit, rootState }) {
            // 在这里commit的mutations默认的是本地、该模块的mutations
            commit('updateText1', rootState.count6) // 这里的updateText1是当前模块下的
          },
          add1 ({ state, commit, rootState }) {
            // 在这里commit的mutations默认的是本地、该模块的mutations
            commit('updateCount5', { num: 56789 }, {root: true}) // {root: true}代表调用的全局的mutations-这里的updateCount5是全局的，在这里{root：true}不加也可以，但是如果b模块加了namespaced: true就不行
          }
        }
        // modules: { 在模块里面也可以声明模块。是一个五险向下嵌套的
        // }
      },
      b: {
        state: {
          text: 3
        },
        actions: {
          textAction ({ commit }) {
            commit('a/updateText2', 'test test', { root: true }) // 模块间的调用
          }
        }
      }
    },
    // vuex插件--页面初始化的时候调用下面的方法--里面可以定义多个ps：watch...
    plugins: [
      (store) => {
        console.log(store, 'my plugin invoked')
      }
    ]
  })
  // 更改state的代码需要刷新页面（自己增加的数据就没了），没有热更替的功能---增加热更替
  if (module.hot) {
    module.hot.accept([
      './store/store',
      './mutations/mutations',
      './getters/getters',
      './actions/actions'
    ], () => {
      const newState = require('./store/store').default
      const newMutations = require('./mutations/mutations').default
      const newGetters = require('./getters/getters').default
      const newActions = require('./actions/actions').default

      store.hotUpdate({
        state: newState,
        mutations: newMutations,
        getters: newGetters,
        actions: newActions
      })
    })
  }
  return store
}
